package transitarios.entidades;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import transitarios.uteis.Morada;

public class Cliente extends AbstractPessoa implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private GregorianCalendar dataRegisto;

	private List<Encomenda> encomendasSolicitadas;

	private TipoCliente tipoCliente;

	public Cliente() {
		super();
		this.dataRegisto = new GregorianCalendar();
		this.encomendasSolicitadas = new ArrayList<Encomenda>();
		this.tipoCliente = TipoCliente.INDIVIDUAL;
	}

	public Cliente(Cliente cli) {
		super(cli.getMorada(), cli.getNacionalidade(), cli.getNome(), cli
				.getNumeroContribuinte(), cli.getCodigo());
		this.dataRegisto = cli.getDataRegisto();
		this.encomendasSolicitadas = cli.getEncomendasSolicitadas();
	}

	public Cliente(Morada morada, String nacionalidade, String nome,
			int numeroContribuinte, String codigo,
			GregorianCalendar dataRegisto,
			List<Encomenda> encomendasSolicitadas, TipoCliente tipoCliente) {
		super(morada, nacionalidade, nome, numeroContribuinte, codigo);
		this.dataRegisto = dataRegisto;
		this.encomendasSolicitadas = encomendasSolicitadas;
		this.tipoCliente = tipoCliente;
	}

	public void acrescentaEncomenda(Encomenda enc) {
		this.encomendasSolicitadas.add(enc.clone());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see transitario.entidades.ICliente#getDataRegisto()
	 */

	@Override
	public Cliente clone() {

		return new Cliente(this);
	}

	public String dataRegistoExtenso() {
		int dia = this.dataRegisto.get(Calendar.DAY_OF_MONTH);
		int mes = this.dataRegisto.get(Calendar.MONTH);
		int ano = this.dataRegisto.get(Calendar.YEAR);
		return dia + "/" + mes + "/" + ano;
	}

	public double devolveValorContratado() {
		double valorContratado = 0;
		for (Encomenda encomenda : this.getEncomendasSolicitadas()) {
			valorContratado += encomenda.precoApagar();
		}

		return valorContratado;
	}

	@Override
	public boolean equals(Object obj) {
		Cliente other = (Cliente) obj;
		return super.equals(obj)
				&& this.dataRegisto.equals(other.getDataRegisto())
				&& this.encomendasSolicitadas.equals(other
						.getEncomendasSolicitadas())
				&& this.tipoCliente.equals(other.getTipoCliente());
	}

	public GregorianCalendar getDataRegisto() {
		return this.dataRegisto;
	}

	// public TipoCliente getTipoCliente() {return this.tipoCliente;}

	// public Encomenda getUltimaEncomenda() {return this.ultimaEncomenda;}

	/*
	 * (non-Javadoc)
	 * 
	 * @see transitario.entidades.ICliente#getEncomendasSolicitadas()
	 */
	public List<Encomenda> getEncomendasSolicitadas() {
		return this.encomendasSolicitadas;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see transitario.entidades.ICliente#getTipoCliente()
	 */
	public TipoCliente getTipoCliente() {
		return this.tipoCliente;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * transitario.entidades.ICliente#setDataRegisto(java.util.GregorianCalendar
	 * )
	 */
	public void setDataRegisto(GregorianCalendar dataRegisto) {
		this.dataRegisto = dataRegisto;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * transitario.entidades.ICliente#setEncomendasSolicitadas(java.util.List)
	 */
	public void setEncomendasSolicitadas(List<Encomenda> encomendasSolicitadas) {
		this.encomendasSolicitadas = encomendasSolicitadas;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * transitario.entidades.ICliente#setTipoCliente(transitarios.uteis.TipoCliente
	 * )
	 */
	public void setTipoCliente(TipoCliente tipoCliente) {
		this.tipoCliente = tipoCliente;
	}
}
